// 文件路径: dbms/cluster/NodeInfo.java
package com.dbms.cluster;

import java.io.Serializable;
import java.util.Objects;

/**
 * 代表分布式集群中的一个节点（Node）的元数据信息。
 * 这个对象是可序列化的，可以方便地在网络间传输。
 *
 * 【已修改】
 * 新增了 `clientPort` 和 `role` 字段，以支持更灵活的集群配置，
 * 例如区分节点间通信端口和客户端连接端口，以及定义节点在主从模式下的角色。
 */
public class NodeInfo implements Serializable {
    // 序列化版本ID，用于在反序列化时验证类的版本一致性
    private static final long serialVersionUID = 1L;

    private final String nodeId;     // 节点的唯一标识符, e.g., "node1"
    private final String host;       // 节点的主机名或IP地址, e.g., "127.0.0.1"
    private final int port;          // 节点用于内部集群通信的端口
    private final int clientPort;    // 节点用于接受外部客户端连接的端口
    private final String role;       // 节点在集群中的角色, e.g., "master", "slave", "member"

    /**
     * NodeInfo 的构造函数。
     * @param nodeId      节点ID
     * @param host        主机地址
     * @param port        内部通信端口
     * @param clientPort  客户端端口
     * @param role        节点角色
     */
    public NodeInfo(String nodeId, String host, int port, int clientPort, String role) {
        this.nodeId = nodeId;
        this.host = host;
        this.port = port;
        this.clientPort = clientPort;
        this.role = role;
    }

    // --- Getter 方法 ---

    public String getNodeId() {
        return nodeId;
    }

    public String getHost() {
        return host;
    }

    public int getPort() {
        return port;
    }

    public int getClientPort() {
        return clientPort;
    }

    /**
     * 新增的 Getter 方法，用于获取节点角色。
     * @return 节点角色字符串。
     */
    public String getRole() {
        return role;
    }

    /**
     * 重写 toString 方法，提供一个易于阅读的字符串表示形式，方便调试和日志记录。
     */
    @Override
    public String toString() {
        return "NodeInfo{" +
                "nodeId='" + nodeId + '\'' +
                ", host='" + host + '\'' +
                ", port=" + port +
                ", clientPort=" + clientPort +
                ", role='" + role + '\'' +
                '}';
    }

    /**
     * 重写 equals 方法，用于正确地比较两个 NodeInfo 对象是否相等。
     * 当所有字段都相同时，两个对象才被认为是相等的。
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        NodeInfo nodeInfo = (NodeInfo) o;
        return port == nodeInfo.port && clientPort == nodeInfo.clientPort && Objects.equals(nodeId, nodeInfo.nodeId) && Objects.equals(host, nodeInfo.host) && Objects.equals(role, nodeInfo.role);
    }

    /**
     * 重写 hashCode 方法，确保相等的对象拥有相同的哈希码。
     * 这对于将 NodeInfo 对象用作 HashMap 的键或存储在 HashSet 中至关重要。
     */
    @Override
    public int hashCode() {
        return Objects.hash(nodeId, host, port, clientPort, role);
    }
}